/*
 *  Copyright 2010 s.tonouchi.
 * 
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 * 
 *       http://www.apache.org/licenses/LICENSE-2.0
 * 
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 *  under the License.
 */
package org.tonouchi.staxframework;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;

/**
 * StaxFrameworkの設定を保持するクラス。現時点ではパス名と対応するクラス名のみを持つ。
 *
 * @author s.tonouchi
 */
class Configuration {

    /**
     * パス名とクラス名の対応マップ
     */
    private Map<String, String> classMap = new HashMap<String, String>();

    /**
     * コンストラクタ。与えられたコンフィグ(XML)を読み込み内部に情報を保持する。
     *
     * @param configPath コンフィグファイルへのパス
     * @throws IOException ファイルIOで例外発生
     * @throws XMLStreamException XML読み込みで例外発生
     */
    Configuration(String configPath) throws IOException, XMLStreamException {
        InputStream is = new FileInputStream(configPath);
        XMLInputFactory factory = XMLInputFactory.newInstance();
        XMLStreamReader reader = factory.createXMLStreamReader(is);

        while (reader.hasNext()) {
            if (reader.next() == XMLStreamConstants.START_ELEMENT) {
                if (reader.getAttributeCount() == 2) {
                    if(classMap.containsKey(reader.getAttributeValue(0))){
                        throw new StaxFrameworkRuntimeException(reader.getAttributeValue(0) + " has already been registered.");
                    }
                    classMap.put(reader.getAttributeValue(0), reader.getAttributeValue(1));
                }
            }
        }

        reader.close();
        is.close();

    }

    /**
     * 引数に与えられたパス名が内部的に保持されているかを検査する。
     *
     * @param path パス名
     * @return true:保持している
     */
    boolean has(String path) {
        return classMap.containsKey(path);
    }

    /**
     * パス名に対応するクラス名を返す。保持していない場合はnullを返す。
     *
     * @param path パス名
     * @return パス名に対応するクラス名、なければnull
     */
    String get(String path) {
        return classMap.get(path);
    }
}
